package net.hn.hnms.biz.plan.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class StatisticsUtil {

    /**
     * 计算同比增长率
     *
     * @param currentYearOutput  当前年的产量
     * @param previousYearOutput 上一年的产量
     * @return 同比增长率（百分比形式，保留两位小数）
     */
    public static String calculateGrowthRate(String currentYearOutput, String previousYearOutput) {
        BigDecimal currentYearOutputBD = new BigDecimal(currentYearOutput);
        BigDecimal previousYearOutputBD = new BigDecimal(previousYearOutput);
        if (previousYearOutputBD.compareTo(BigDecimal.ZERO) == 0) {
            // 如果上一年值为 0 或 null，则返回 null（避免除零错误）
            return "0.00";
        }
        // 计算同比增长率
        BigDecimal growthRate = currentYearOutputBD.subtract(previousYearOutputBD)
                .divide(previousYearOutputBD, 4, RoundingMode.HALF_UP)  // 保留4位小数
                .multiply(new BigDecimal("100"));  // 转换为百分比
        // 返回保留两位小数的结果
        return growthRate.setScale(2, RoundingMode.HALF_UP).toString();
    }

    /**
     * 计算环比增长率
     *
     * @param currentValueStr  本期值（字符串形式）
     * @param previousValueStr 上期值（字符串形式）
     * @return 环比增长率（带 % 的字符串形式，保留两位小数）
     */
    public static String calculateMoMGrowthRate(String currentValueStr, String previousValueStr) {
        // 将字符串转换为 BigDecimal
        BigDecimal currentValue;
        BigDecimal previousValue;

        try {
            currentValue = new BigDecimal(currentValueStr);
            previousValue = new BigDecimal(previousValueStr);
        } catch (NumberFormatException e) {
            // 如果转换失败，返回错误信息或空值
            return "0.0";
        }

        // 如果上期值为 0 或 null，无法计算环比增长率
        if (previousValue.compareTo(BigDecimal.ZERO) == 0) {
            return "0.0";  // 或者返回其他提示信息
        }

        // 计算环比增长率
        BigDecimal growthRate = currentValue.subtract(previousValue)
                .divide(previousValue, 4, RoundingMode.HALF_UP)
                .multiply(new BigDecimal("100"));

        // 格式化为保留两位小数并添加 %
        return growthRate.setScale(2, RoundingMode.HALF_UP).toString();
    }


    /**
     * 计算完成率
     *
     * @param actualStr 实际完成值（字符串形式）
     * @param targetStr 目标值（字符串形式）
     * @return 完成率（带 % 的字符串形式，保留两位小数）
     */
    public static String calculateCompletionRate(String actualStr, String targetStr) {
        // 将字符串转换为 BigDecimal
        BigDecimal actual;
        BigDecimal target;

        try {
            actual = new BigDecimal(actualStr);
            target = new BigDecimal(targetStr);
        } catch (NumberFormatException e) {
            // 如果转换失败，返回错误信息或空值
            return "Invalid input";
        }

        // 如果目标值为 0 或 null，无法计算完成率
        if (target.compareTo(BigDecimal.ZERO) == 0) {
            return "N/A";  // 或者返回其他提示信息
        }

        // 计算完成率
        BigDecimal completionRate = actual.divide(target, 4, RoundingMode.HALF_UP)
                .multiply(new BigDecimal("100"));

        // 格式化为保留两位小数并添加 %
        return completionRate.setScale(2, RoundingMode.HALF_UP).toString() + "%";
    }

    /**
     * 计算比率
     *
     * @param numeratorStr   分子（字符串形式）
     * @param denominatorStr 分母（字符串形式）
     * @return 比率（字符串形式，保留两位小数）
     */
    public static String calculateRatio(String numeratorStr, String denominatorStr) {
        // 将字符串转换为 BigDecimal
        BigDecimal numerator;
        BigDecimal denominator;

        try {
            numerator = new BigDecimal(numeratorStr);
            denominator = new BigDecimal(denominatorStr);
        } catch (NumberFormatException e) {
            // 如果转换失败，返回错误信息或空值
            return "0.00";
        }

        // 如果分母为 0，无法计算比率
        if (denominator.compareTo(BigDecimal.ZERO) == 0) {
            return "0.00";  // 或者返回其他提示信息
        }

        // 计算比率
        BigDecimal ratio = numerator.divide(denominator, 4, RoundingMode.HALF_UP);

        // 格式化为保留两位小数的字符串
        return ratio.setScale(2, RoundingMode.HALF_UP).toString();
    }

}
